import json
import logging
from typing import Dict, Optional
from app.core.config import settings

logger = logging.getLogger(__name__)


class AIService:
    """AI内容生成服务"""
    
    def __init__(self):
        self.llm = None
        self._init_llm()
    
    def _init_llm(self):
        """初始化LLM"""
        try:
            if settings.LLM_PROVIDER == "openai" and settings.OPENAI_API_KEY:
                from langchain_openai import ChatOpenAI
                self.llm = ChatOpenAI(
                    api_key=settings.OPENAI_API_KEY,
                    base_url=settings.OPENAI_BASE_URL,
                    model="gpt-3.5-turbo",
                    temperature=0.7
                )
                logger.info("OpenAI LLM initialized successfully")
            else:
                logger.warning("LLM provider not configured or API key missing")
        except Exception as e:
            logger.error(f"Failed to initialize LLM: {e}")
    
    def generate_post_content(self, topic: str, style: str = "小红书爆款") -> Dict[str, str]:
        """根据主题生成小红书风格的图文内容"""
        if not self.llm:
            # 如果LLM未配置，返回模拟数据
            return self._generate_mock_content(topic, style)
        
        try:
            from langchain.prompts import PromptTemplate
            
            prompt_template = """
请你扮演一位小红书爆款内容写手。
根据以下主题，为我创作一篇小红书笔记：
主题：{topic}
风格要求：{style}

请以JSON格式返回，包含以下字段：
- "title": 吸引人的标题（不超过30字）
- "content": 正文内容（包含表情符号，分段清晰，300-800字）
- "suggested_tags": 建议的标签（以逗号分隔，不超过10个）

注意：
1. 标题要有吸引力，可以使用数字、疑问句等
2. 正文要有层次感，使用适当的表情符号
3. 标签要与内容相关，有助于曝光
4. 整体风格要符合小红书用户喜好

请直接返回JSON格式，不要包含其他文字。
            """
            
            prompt = PromptTemplate.from_template(prompt_template)
            chain = prompt | self.llm
            
            response = chain.invoke({"topic": topic, "style": style})
            
            # 解析返回的JSON字符串
            if hasattr(response, 'content'):
                content_str = response.content
            else:
                content_str = str(response)
            
            # 尝试解析JSON
            try:
                parsed_response = json.loads(content_str)
                return {
                    "title": parsed_response.get("title", f"{topic}相关内容"),
                    "content": parsed_response.get("content", f"关于{topic}的精彩内容..."),
                    "suggested_tags": parsed_response.get("suggested_tags", topic)
                }
            except json.JSONDecodeError:
                logger.error(f"Failed to parse LLM response as JSON: {content_str}")
                return self._generate_mock_content(topic, style)
                
        except Exception as e:
            logger.error(f"Error generating content with LLM: {e}")
            return self._generate_mock_content(topic, style)
    
    def _generate_mock_content(self, topic: str, style: str) -> Dict[str, str]:
        """生成模拟内容（当LLM不可用时）"""
        return {
            "title": f"🔥{topic}必看攻略！超实用干货分享",
            "content": f"""哈喽小伙伴们！今天来和大家分享关于{topic}的超实用内容～

✨ 重点来了：
1️⃣ 第一个要点
2️⃣ 第二个要点  
3️⃣ 第三个要点

💡 小贴士：
记得点赞收藏哦，这样就不会找不到啦～

📝 总结：
{topic}真的太重要了，希望这篇分享对大家有帮助！

❤️ 如果觉得有用的话，记得给我点个赞哦～
你们的支持是我继续分享的动力！

#小红书 #{topic} #干货分享""",
            "suggested_tags": f"{topic},干货分享,实用攻略,小红书,生活技巧"
        }
    
    def is_available(self) -> bool:
        """检查AI服务是否可用"""
        return self.llm is not None


# 创建全局实例
ai_service = AIService()